﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace PrismEventAggregator
{
    /// <summary>
    /// SubWindow.xaml 的交互逻辑
    /// </summary>
    public partial class SubWindow : Window
    {
        public SubWindow()
        {
            InitializeComponent();

            // 1、消息无过滤
            //Messenger.Defualt.GetEvent<EventMessageArgs>()
            //    .Subscribe(Receive);

            // 2、符合条件的消息接收
            // Subscribe(Action<TPayload> action, Predicate<TPayload> filter)
            Messenger.Defualt.GetEvent<EventMessageArgs1>()
                .Subscribe(Receive1, (obj) => obj.Id == 1);

            // 3、消息委托的引用方式
            // Subscribe(Action<TPayload> action, bool keepSubscriberReferenceAlive)
            // keepSubscriberReferenceAlive:默认是False
            // false     true->对象销毁的时候，做注销操作
            Messenger.Defualt.GetEvent<EventMessageArgs>()
                .Subscribe(Receive, true);

            // 4、多线程状态控制
            // Subscribe(Action<TPayload> action, ThreadOption threadOption)
            // 关于ThreadOption选项：
            // PublisherThread: 发布者在什么线程发布的   这个注册的逻辑就在哪个线程执行
            // UIThread： 不管发布者在哪个线程发布，这里注册的逻辑总在UI线程执行
            //          如果在执行逻辑里有页面对象的操作，可以选择这个选项
            // BackgroundThread： 不管发布者在哪个线程发布，这里注册的逻辑总在后台线程执行
            //          如果有个数据与主线程无关，但是需要执行，这里一般使用后台线程处理
            // PublisherThread&UIThread  消息逻辑执行完成后，返回发布方
            // BackgroundThread  新建一个线程，把消息逻辑包起来，跟发布方无关
            Messenger.Defualt.GetEvent<EventMessageArgs>()
                .Subscribe(Receive, Prism.Events.ThreadOption.BackgroundThread);
        }

        protected override void OnClosed(EventArgs e)
        {
            base.OnClosed(e);

            // 注销订阅 
            Messenger.Defualt.GetEvent<EventMessageArgs>()
                .Unsubscribe(Receive);
        }

        private void Receive1(DataModel obj)
        {

        }

        private void Receive(object obj)
        {
            var id = Thread.CurrentThread.ManagedThreadId;
            //......



            var ea = obj as EventAction;

            ea.ResultAction.Invoke(true);
        }
    }
}
